package com.yxx.utils;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;

/**
 * HTML工具类
 * @author yuxiangxun
 * @date 2025/1/18
 * @apiNote
 */
@SuppressWarnings(value = "all")  // 抑制所有编译器警告
public class HTMLUtils {
    // 敏感词过滤器

    // 初始化配置
    private static final SensitiveWordBs WORD_BS = SensitiveWordBs.newInstance()
        // 忽略大小写
        .ignoreCase(true)
        // 忽略全角半角字符
        .ignoreWidth(true)
        // 忽略数字样式
        .ignoreNumStyle(true)
        // 忽略中文样式
        .ignoreChineseStyle(true)
        // 忽略英文样式
        .ignoreEnglishStyle(true)
        // 忽略重复字符
        .ignoreRepeat(true)
        // 禁用数字检查
        .enableNumCheck(false)
        // 禁用邮箱检查
        .enableEmailCheck(false)
        // 禁用URL检查
        .enableUrlCheck(false)
        // 初始化敏感词过滤器
        .init();

    /**
     * 删除标签
     * @param source 需要进行剔除HTML的文本
     * @return 过滤后的内容
     */
    public static String filter(String source){
        // 敏感词过滤替换
        source = WORD_BS.replace(source);
        // 保留图片标签
        source = source
                // 删除所有HTML标签，但保留<img>标签
                .replaceAll("(?!<(img).*?>)<.*?>", "")
                // 删除<img>标签中的onload属性 防止潜在的安全风险（如XSS攻击）
                .replaceAll("(onload(.*?)=)", "")
                // 删除<img>标签中的onerror属性 防止潜在的安全风险（如XSS攻击）
                .replaceAll("(onerror(.*?)=)", "");
        // 进一步处理文本，删除给定字符创中特定HTML标签（script标签和style标签）和转义字符
        return deleteHtmlTag(source);
    }

    /**
     * 删除标签
     * @param source 文本
     * @return 过滤后的文本
     */
    public static String deleteHtmlTag(String source) {
        // 删除转义字符
        source = source.replaceAll("&.{2,6}?;", "");
        // 删除script标签
        source = source.replaceAll("<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>", "");
        // 删除style标签
        source = source.replaceAll("<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>", "");
        return source;
    }
}
